<?php
/*
* Что тут происходит?
*
* 1. создание записи
* 	а) создание и вывод формы по разделу
* 	б) прием формы, валидация, пост-обработка (аплоады, парсинг введенной инфы перед сохранением)
*
*/
$this->useClass("Handler_Item");
$this->useClass("Handler_CreateItem");
class Action_Community_CreateItem extends Handler_CreateItem
{
	public function process ()
	{
		$ops = $this->aa->getAvailableOperations();

		if ( !isset($ops['item_create']) || !$ops['item_create']['is_allowed'] ) {
			$view = $this->rh->views->findByName('accessdnd');
			$view->data = $aa->template_data;
			$this->rh->response->setContent( $view );
			return;
		}

		$aa = &$this->aa;

		if ( !isset($this->ctx->doctypes[$aa->acl_data['doctype_url']])
		&& empty($aa->acl_data['tdi_url']) ) {
			$aa->acl_data['tdi_url'] = $aa->acl_data['doctype_url'];
			$aa->acl_data['doctype_url'] = 'doc';
		}

		$aa->getInfo();
		$aa->checkDeletions( array($this, "shutdown") );
		$this->setupView();

		$this->determineProcessType();

		$doctypes_options = $this->getDoctypesOptions();

		$this->fc->setDoctypes($doctypes_options, $this->process_type);

		$cm = $this->ctx->mm->getModel("Community");
		$community = $cm->getCommunity($aa->acl_data['comity_oid']);
		$this->fc->setSkin($cm->getSkin( $community ));

		$this->createForm();

		// оказывается мы имеем дело с конкретной формой
		$result = $this->process_form->Handle();

		if ($result != false) {
			$this->setViewVar("formcontent", $result);

		} else {
			// прошли валидацию
			// пытаемся сделать постобработку
			$this->postProcess();
		}
		$this->rh->response->setContent($this->view);

	} // end of function process

	private function postProcess()
	{

		$aa = $this->aa;
		$this->ctx->db->begin();

		$form = $this->process_form;

		// извлечем описание типа документа

		// в $this->ctx->system_fields перечислены поля, которые в обязательном порядке создаются у/для всех документов.
		//
		// может возникнуть иллюзия, что конкретный набор полей задается в /skins/<skin>/create_item_groups.php
		// это не так!! данный конфиг отвечает лишь за порядок отображения.
		$fields = array_merge($this->ctx->doctypes[ $this->process_type ]['fields'],  $this->ctx->system_fields);

		foreach ($fields as $field_name=>$field_config) {
			$field_values[ $field_name ] = $form->hash[ $field_name ]->model->model_data;
		}

		$field_values['tdi_oid'] = $form->hash["tdi_oid"]->model->model_data;
		$field_values['posted_by_id'] = $aa->acl_data['user']['user_id'] ? $aa->acl_data['user']['user_id'] : 0;
		$field_values['community_oid'] = $aa->acl_data['comity_oid'];

		if ( !empty($field_values['tags']) ) {
			$allTags = preg_split('/[\,\;]/', $field_values['tags'] );
			foreach ( $allTags as $item ) {
				$item = trim($item);
				$tag = mb_strtolower($item);
				$tags[$tag] = $item;
			}

			$field_values['tags'] = join(',', $tags);

			$field_values['tags'] = preg_replace( '/[\ \s]+/', ' ', $field_values['tags'] );
		}

		// ============================= {{ Ветка создания

		$parent_oid = $form->hash['tdi_oid']->model->model_data != 0
			? $form->hash['tdi_oid']->model->model_data
			: $aa->acl_data['comity_oid'];

		$result = $this->createItem( $this->process_type, $fields, $field_values, $parent_oid );

		if ($result instanceof fobject) {
			$obj = $result;
			$this->redirectToItem('Запись создана', $obj);
		} else {
			// какая-то ошибка произошла на пост-обработке полей
			$this->setViewVar('error_message', $result);
			$this->ctx->db->rollback();
			// отрендерим форму заново

			$tf = array(
			$this->process_type => array(
			"content"=>$this->process_form->Handle(false, NULL, NULL, NULL, true),
			"type"=>$this->process_type,
			"selected"=>1
			)
			);
			$this->setViewVar('type_forms', $tf);
		}
		// }} Ветка создания =============================
	}
}
